package com.eta.common.utils;

import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author 星河一叶Ck
 * @date 2025/9/8
 * @description Redis缓存工具类
 */

@Component
public class RedisCache {

    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 存储键值对
     * @param key 键
     * @param value 值
     */
    public void setCacheObject(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 存储键值对，并设置超时时间
     * @param key 键
     * @param value 值
     * @param timeout 超时时间
     * @param timeUnit 时间单位
     */
    public void setCacheObject(String key, Object value, long timeout, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    /**
     * 获取缓存值
     * @param key 键
     * @return 缓存值
     */
    public Object getCacheObject(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除缓存
     * @param key 键
     * @return 删除成功与否
     */
    public Boolean deleteObject(String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 自增操作（用于统计次数）
     * @param key 键
     * @param delta 自增数
     * @return 自增后的值
     */
    public Long increment(String key, long delta) {
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * 自增并设置过期时间（首次设置时生效）
     * @param key 键
     * @param delta 自增数
     * @param timeout 超时时间
     * @param timeUnit 时间单位
     * @return 自增后的值
     */
    public Long increment(String key, long delta, long timeout, TimeUnit timeUnit) {
        Long count = redisTemplate.opsForValue().increment(key, delta);
        if (count != null && count == 1) {
            redisTemplate.expire(key, timeout, timeUnit);
        }
        return count;
    }
}
